package com.steve.summary.tcc;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: STEVE
 * @Description: 事务日志（用于持久化TCC各阶段状态）
 * @since: 2025-05-23
 */
public class TransactionLog {

    // Try记录需保留服务名和操作数据
    private final Map<String, String> tryRecords = new ConcurrentHashMap<>(); // Key: txId_serviceName

    // Confirm和Cancel记录按服务区分
    private final Set<String> confirmRecords = ConcurrentHashMap.newKeySet(); // Key: txId_serviceName
    private final Set<String> cancelRecords = ConcurrentHashMap.newKeySet(); // Key: txId_serviceName

    /**
     * 记录Try阶段操作日志
     *
     * @param txId        全局事务ID
     * @param serviceName 服务名
     * @param data        数据
     */
    public void logTry(String txId, String serviceName, String data) {
        tryRecords.put(txId + "_" + serviceName, data);
        // 实际项目应写入数据库
    }

    /**
     * 记录Confirm阶段操作日志
     *
     * @param txId        全局事务ID
     * @param serviceName 服务名
     */
    public void logConfirm(String txId, String serviceName) {
        confirmRecords.add(txId + "_" + serviceName);
    }

    /**
     * 记录Cancel阶段操作日志
     *
     * @param txId            全局事务ID
     * @param serviceName     服务名
     * @param isEmptyRollback 是否为空回滚（true表示未执行Try直接Cancel）
     */
    public void logCancel(String txId, String serviceName, boolean isEmptyRollback) {
        cancelRecords.add(txId + "_" + serviceName + (isEmptyRollback ? "_EMPTY" : ""));
    }

    /**
     * 检查是否存在Try记录
     *
     * @param txId 全局事务ID
     * @return true表示已执行过Try
     */
    public boolean isTryRecordExists(String txId, String serviceName) {
        return tryRecords.containsKey(txId + "_" + serviceName);
    }

    /**
     * 获取Try记录
     *
     * @param txId        全局事务ID
     * @param serviceName 服务名
     * @return
     */
    public String getTryData(String txId, String serviceName) {
        return tryRecords.get(txId + "_" + serviceName);
    }

    /**
     * 检查是否存在Confirm记录
     *
     * @param txId        全局事务ID
     * @param serviceName 服务名
     * @return true表示已执行过Confirm
     */
    public boolean isConfirmRecordExists(String txId, String serviceName) {
        return confirmRecords.contains(txId + "_" + serviceName);
    }

    /**
     * 检查是否存在Cancel记录（包含空回滚）
     *
     * @param txId 全局事务ID
     * @param serviceName 服务名
     * @return true表示已执行过Cancel或空回滚
     */
    public boolean isCancelRecordExists(String txId, String serviceName) {
        return cancelRecords.contains(txId + "_" + serviceName) ||
                cancelRecords.contains(txId + "_" + serviceName + "_EMPTY");
    }

}
